package utils

import (
	"sync/atomic"
)

// IDGenerator 原子操作 ID 自增器结构体
// 对外暴露结构体（大写），但内部字段小写（隐藏实现）
type IDGenerator struct {
	lastID uint64 // 记录最后一次生成的 ID，原子操作保证并发安全
}

// NewIDGenerator 创建 ID 自增器实例
// 对外暴露构造函数（大写），支持指定起始 ID（生成的第一个 ID 就是 startID）
func NewIDGenerator(start uint64) *IDGenerator {
	// 初始化时将 lastID 设为 startID - 1，确保第一次调用 NextID() 返回 startID
	// 如果 start 为 null，则默认起始 ID 为 0
	if start == 0 {
		start = 1
	}
	return &IDGenerator{lastID: start - 1}
}
func NewDefaultIDGenerator() *IDGenerator {
	return NewIDGenerator(1)
}

// NextID 生成下一个自增 ID
// 对外暴露生成方法（大写），通过 atomic.AddUint64 实现无锁并发安全
func (g *IDGenerator) NextID() uint64 {
	// 原子操作：将 lastID 加 1，并返回新值（一步完成，无并发安全问题）
	return atomic.AddUint64(&g.lastID, 1)
}

// GetCurrentID 获取当前最新的 ID（非必需，按需提供）
func (g *IDGenerator) GetCurrentID() uint64 {
	// 原子操作读取当前 lastID（避免普通读取的内存可见性问题）
	return atomic.LoadUint64(&g.lastID)
}
